home *** CD-ROM | disk | FTP | other *** search
/ Programming an RTS Game with Direct3D / Programming an RTS Game with Direct3D.iso / Examples / Chapter 12 / Example 12.8 / camera.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2006-06-30  |  2.0 KB  |  96 lines

  1. #include "camera.h"
  2.  
  3. CAMERA::CAMERA()
  4. {
  5.     Init(NULL);
  6. }
  7.  
  8. void CAMERA::Init(IDirect3DDevice9* Dev)
  9. {
  10.     m_pDevice = Dev;
  11.     m_alpha = m_beta = 0.5f;
  12.     m_radius = 10.0f;
  13.     m_fov = D3DX_PI / 4.0f;
  14.  
  15.     m_eye = D3DXVECTOR3(50.0f, 50.0f, 50.0f);
  16.     m_focus = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
  17. }
  18.  
  19. void CAMERA::Scroll(D3DXVECTOR3 vec)
  20. {
  21.     D3DXVECTOR3 newFocus = m_focus + vec;
  22.    m_focus = newFocus;
  23. }
  24.  
  25. void CAMERA::Pitch(float f)
  26. {
  27.     m_beta += f;
  28.  
  29.     if(m_beta > (D3DX_PI / 2.0f) - 0.05f)m_beta = D3DX_PI / 2.0f - 0.05f;
  30.     if(m_beta < 0.3f)m_beta = 0.3f;
  31. }
  32.  
  33. void CAMERA::Yaw(float f)
  34. {
  35.     m_alpha += f;
  36.     if(m_alpha > D3DX_PI * 2.0f)m_alpha -= D3DX_PI * 2.0f;
  37.     if(m_alpha < -D3DX_PI * 2.0f)m_alpha += D3DX_PI * 2.0f;
  38. }
  39.  
  40. void CAMERA::Zoom(float f)
  41. {
  42.     m_fov += f;
  43.  
  44.     if(m_fov < 0.1f)m_fov = 0.1f;
  45.     if(m_fov > D3DX_PI / 2.0f)m_fov = D3DX_PI / 2.0f;
  46. }
  47.  
  48. void CAMERA::ChangeRadius(float f)
  49. {
  50.     m_radius += f;
  51.  
  52.     if(m_radius < 3.0f)m_radius = 3.0f;
  53.     if(m_radius > 70.0f)m_radius = 70.0f;
  54. }
  55.  
  56. void CAMERA::Update(float timeDelta)
  57. {
  58.     //Move Camera (i.e. Change Angle)
  59.     if(KEYDOWN(VK_LEFT))Yaw(-timeDelta);
  60.     if(KEYDOWN(VK_RIGHT))Yaw(timeDelta);
  61.     if(KEYDOWN(VK_UP))Pitch(timeDelta);
  62.     if(KEYDOWN(VK_DOWN))Pitch(-timeDelta);
  63.  
  64.     //Calculate Eye Position
  65.     float sideRadius = m_radius * cos(m_beta);
  66.     float height = m_radius * sin(m_beta);
  67.  
  68.     m_eye = D3DXVECTOR3(m_focus.x + sideRadius * cos(m_alpha),
  69.                       m_focus.y + height, 
  70.                       m_focus.z + sideRadius * sin(m_alpha));
  71.  
  72.     if(m_pDevice != NULL)
  73.     {
  74.         D3DXMATRIX view = GetViewMatrix();
  75.         D3DXMATRIX projection = GetProjectionMatrix();
  76.  
  77.         m_pDevice->SetTransform(D3DTS_VIEW, &view);
  78.         m_pDevice->SetTransform(D3DTS_PROJECTION, &projection);
  79.     }    
  80. }
  81.  
  82. D3DXMATRIX CAMERA::GetViewMatrix()
  83. {
  84.     D3DXMATRIX  matView;
  85.     D3DXMatrixLookAtLH(&matView, &m_eye, &m_focus, &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
  86.  
  87.     return  matView;
  88. }
  89.  
  90. D3DXMATRIX CAMERA::GetProjectionMatrix()
  91. {
  92.     D3DXMATRIX  matProj;
  93.     float aspect = 800.0f / 600.0f;
  94.     D3DXMatrixPerspectiveFovLH(&matProj, m_fov, aspect, 1.0f, 1000.0f );
  95.     return matProj;
  96. }